package com.leetcode.practice.leetcode;

/**
 * 给你一个整数 n ，请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位数字。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：n = 3
 * 输出：3
 * 示例 2：
 *
 * 输入：n = 11
 * 输出：0
 * 解释：第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ，它是 10 的一部分。
 *  
 *
 * 提示：
 *
 * 1 <= n <= 231 - 1
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/nth-digit
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 */
public class No400 {
    public static void main(String[] args) {
        System.out.println(new No400().findNthDigit(1000000000));
    }
    public int findNthDigit(int n) {
        //一位数直接返回
        if(n < 10){
            return n;
        }
        //n表示的是长度，扣除9个一位数，还剩n-9个长度
        n-=9;
        //位数 初始值为2位数
        int sit = 2;
        //返回结果
        double result = 0;
        //数字的第几位
        double lastSit;
        //定位到的数字
        double currentNum;
        //区间总共有多少个数字
        double betweenSit;
        for (double i = 10; i < Integer.MAX_VALUE; i*=10) {
            //i * 10 - i => i * 9
            betweenSit = i * 9;
            //如果剩余的长度比区间总共的长度还长
            if(n > betweenSit * sit){
                //n扣除该区间长度
                n -= betweenSit * sit;
                //位数++
                sit++;
                continue;
            }
            //计算n所对应的数字 n需要+1，否则会出现 1/2 = 0 的情况
            currentNum = (n + 1) / sit + i - 1;

            //n所在的数字currentNum的第几位，0表示最后一位
            lastSit = n % sit;
            if(lastSit == 0){
                lastSit = sit;
            }

            //计算数字currentNum的第lastSit位数字
            for (int i1 = 0; i1 < (sit - lastSit + 1); i1++) {
                result = currentNum % 10;
                currentNum = currentNum / 10;
            }
            return (int) result;
        }
        return 0;
    }
}
